package com.delay.queue.delayedqueue.springschedule;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author gxing
 * @desc
 * @date 2021/3/17
 */
@Component
public class ScheduledTaskManager {
    private static final Logger logger = LogManager.getLogger(ScheduledTaskManager.class);

    /**
     * corn 表达式:
     * [0 0/2 * * * ?]每2分种执行一次
     * [0/5 * * * * ?]每5秒扫许一次
     * 如果本次任务的执行时间稍长点, 则难以评估下次任务的开始时间
     */
//    @Async
//    @Scheduled(cron = "0/2 * * * * *")
//    public void scheduled() {
//        logger.info("=====>>>>>cron表达式 start: {}", System.currentTimeMillis());
//        try {
//            Thread.sleep(200);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        logger.info("=====>>>>>cron表达式   end: {}", System.currentTimeMillis());
//    }

    /**
     * fixedRate：指定本次任务开始到下次任务开始的周期间隔,包含了本次任务的执行时间
     * fixedRate = 下次任务开始时间 - 本次任务开始时间
     * 如果本次任务的执行时间小于间隔时间，下次任务开始时间 = 本次任务开始时间 + 执行时间
     * 如果本次任务的执行时间大于等于间隔时间, 下次任务开始时间 = 则本次任务的结束时间
     */
//    @Async
//    @Scheduled(fixedRate = 2000)
//    public void scheduled1() {
//        logger.info("=====>>>>>fixedRate start: {}", System.currentTimeMillis());
//        try {
//            Thread.sleep(300);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        logger.info("=====>>>>>fixedRate   end: {}", System.currentTimeMillis());
//    }

    /**
     * fixedDelay: 指定本次任务结束到下次任务开始的周期间隔
     * 下次任务开始时间 = 本次任务结束时间 + 周期间隔, 不受本次任务的执行时间影响
     */
//    @Scheduled(fixedDelay = 2000)
//    public void scheduled2() {
//        logger.info("=====>>>>>fixedDelay start: {}", System.currentTimeMillis() / 1000);
//        try {
//            Thread.sleep(5000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        logger.info("=====>>>>>fixedDelay   end: {}", System.currentTimeMillis() / 1000);
//    }
}
